package ar.edu.utn.frgp.banco.menu;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


import java.util.List;
import java.util.Scanner;

import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Movimientos;
import ar.edu.utn.frgp.banco.domain.PlazoFijo;



import ar.edu.utn.frgp.banco.exceptions.ServiceException;
import ar.edu.utn.frgp.banco.service.RecursoServiceCuenta;
import ar.edu.utn.frgp.banco.service.RecursoServiceMovimientos;
import ar.edu.utn.frgp.banco.service.RecursoServicePlazoFijo;

import ar.edu.utn.frgp.banco.service.impl.RecursoServiceCuentaImpl;
import ar.edu.utn.frgp.banco.service.impl.RecursoServiceMovimientosImpl;
import ar.edu.utn.frgp.banco.service.impl.RecursoServicePlazoFijoImpl;


public class MenuPlazosFijos {
	
	public void menuPlazosFijos() 
	{
		Integer  operacion ;
		Scanner A = new Scanner(System.in);
		do{
			System.out.println(" ");
			System.out.println("1_Crear Plazo Fijo");
	 		System.out.println("2_Renovar Plazo Fijo");
	 		System.out.println("3_Liquidar Plazo Fijo");
	 		System.out.println("4_Listar Plazos Fijos por cliente");
	 		System.out.println("5_Listar Plazos Fijos"); 
	 		System.out.println("0_Volver al Menu Principal");
	 	    System.out.println(" ");
	 		System.out.println("Ingrese una Opcion: ");
	 		operacion = A.nextInt();
			
			
	 		
	 		Movimientos regMovimiento = new Movimientos();
	 		RecursoServiceMovimientos serviceMovimientos = new RecursoServiceMovimientosImpl();
	 		
	 		
	 		Cuenta cuorigen = new Cuenta ();
	 		Cuenta cudestino = new Cuenta ();
	 		PlazoFijo regPlazoFijo = new PlazoFijo();
	 		PlazoFijo plazofijo = new PlazoFijo();
						
			RecursoServiceCuenta serviceCuenta = new RecursoServiceCuentaImpl();
			RecursoServicePlazoFijo servicePlazoFijo = new RecursoServicePlazoFijoImpl();
	 		
			int  dniCliente;
			int  cuentaClienteOrigen;
			int  cuentaClienteDestino;
			double  montoApertura;
			double  montoRenovacion;
			double  montoAliquidar;
			double  montoInteres;
			int dias;
			int interes;
			int nroPlazoFijo;
			
			
			Scanner dni = new Scanner(System.in);
			Scanner cuentaOrigen = new Scanner(System.in);
			Scanner cuentaDestino = new Scanner(System.in);
			Scanner montoPedido = new Scanner(System.in);
			Scanner cantidadDias = new Scanner(System.in);
			Scanner codPlazoFijo = new Scanner(System.in);
			
					
	 		
	 		
			switch(operacion)
				{
			   ///////////////////////////////////////////////////////////////////
				case 1: 
					
					System.out.println("Ingrese el dni del cliente solicitante del plazo fijo");
					dniCliente = dni.nextInt();
					
					// lista las cuentas del cliente ingresado
					try {
						List<Cuenta> cuentas = serviceCuenta.listarCuentasActivas(dniCliente);
						
							for (Cuenta c: cuentas){
								System.out.println("");
								 System.out.println("dni "+ c.getDni());
								 System.out.println("nro cuenta "+ c.getNrocuenta());
								 System.out.println("tipo cuenta "+ c.getTipoCuenta());
								 System.out.println("estado "+ c.getEstado());
								 System.out.println("saldo "+ c.getSaldo());
								 System.out.println("descubierto "+ c.getDescubierto());
								 System.out.println("");
							}
						  } catch (ServiceException e) {
						  System.out.println("Error al listar todas las Cuentas Corrientes . " + e.getMessage());
					}
					
					
					//pide que elija un numero de cuenta
					System.out.println("Ingrese el numero de cuenta para debitar el monto del plazo fijo");
					cuentaClienteOrigen = cuentaOrigen.nextInt();
					
					System.out.println("Ingrese el numero de cuenta para acreditar el monto del plazo fijo");
					cuentaClienteDestino = cuentaDestino.nextInt();
														
					System.out.println("Ingrese el monto de apertura del plazo fijo");
					montoApertura = montoPedido.nextDouble();
									
					System.out.println("Ingrese la cantidad de dias del deposito de plazo fijo");
					dias = cantidadDias.nextInt();
					
					
					if (dias >=90)
						{interes = 13;}
					else 
						{if (dias <=60)
						{interes = 10;}
						else
						{interes = 12;}
						}
					
					
					SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
					
					Calendar cal = Calendar.getInstance();
					Date fechaAlta = cal.getTime();
					
				//	System.out.println(formatter.format(fechaAlta));
					
					cal.add(Calendar.DATE, dias);
					Date fechaVencimiento = cal.getTime();
					
				//	System.out.println(formatter.format(fechaVencimiento));


					
					 System.out.println("");
					 System.out.println("dni del cliente "+ dniCliente );
					 System.out.println("fecha de alta " + formatter.format(fechaAlta));
					 System.out.println("fecha de vencimiento"+ (formatter.format(fechaVencimiento)));
					 System.out.println("nro cuenta Origen"+ cuentaClienteOrigen );
					 System.out.println("nro cuenta Destino"+ cuentaClienteDestino );
					 System.out.println("Monto del Plazo Fijo "+ montoApertura);
					 System.out.println("dias de Plazo "+ dias);
					 System.out.println("Interes "+ interes +"%");
					 System.out.println("Monto del interes "+ montoApertura * interes/100);
					 System.out.println("");
					
					///// busca la cuenta y el servicio modifica el saldo y registra el pago
				try {
					cuorigen = serviceCuenta.buscarCuenta(cuentaClienteOrigen); //busco y traigo la cuenta de la cual se va a debitar el monto
					cudestino = serviceCuenta.buscarCuenta(cuentaClienteDestino); //busco y traigo la cuenta de la cual se va a debitar el monto
										
					cuorigen.setSaldo(cuorigen.getSaldo()- montoApertura );// modifico el saldo de esa cuenta (saldo de la cuenta - monto fijo del servicio)
					serviceCuenta.modificarSaldoCuenta(cuorigen);/// le mando a modificar saldo cuenta la cuenta con el saldo modificado
					
					regPlazoFijo.cargarPlazoFijo(fechaAlta,fechaVencimiento,dniCliente,2,cuorigen.getNrocuenta(),1,cudestino.getNrocuenta(),montoApertura,interes);
					servicePlazoFijo.crearPlazosFijos(regPlazoFijo);
					
										
					regMovimiento.cargarMovimiento(cuentaClienteOrigen, 1, 5, cuorigen.getSaldo(),montoApertura);
					serviceMovimientos.registrarMovimiento(regMovimiento);
					
					
				} catch (ServiceException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
									
					
					
					
				break;
				////////////////////////////////////////////////////////////////
				case 2: 
					
					
					System.out.println("Ingrese el dni del cliente que desea renovar el plazo fijo");
					dniCliente = dni.nextInt();
					
					try {
						
						List<PlazoFijo> pf = servicePlazoFijo.listarPlazosFijosCliente(dniCliente,1);
						
						for (PlazoFijo c: pf){
							System.out.println("");
							System.out.println("Id plazo fijo: " + c.getIdplazofijo());
							System.out.println("dni: " + c.getDni());
							System.out.println("fechaalta: " + c.getFechaalta());
							System.out.println("fechavencimiento: " + c.getFechavencimiento());
							System.out.println("origen: " + c.getOrigen());
							System.out.println("cuenta origen: " + c.getNrocuentaorigen());
							System.out.println("acreditacion: " + c.getAcreditacion());
							System.out.println("cuenta destino: " + c.getNrocuentadestino());
							System.out.println("monto: " + c.getMonto());
							System.out.println("interes: " + c.getInteres()+"%");
							System.out.println("estado: " + c.getEstado());
							System.out.println("");
						}
						
						
					} catch (ServiceException e) {
						System.out.println("Error al listar los servicios pagos . " + e.getMessage());
					}
					
					
					//pide que elija un numero de cuenta
					System.out.println("Ingrese el numero de plazo fijo que desea renovar");
					nroPlazoFijo = codPlazoFijo.nextInt();
					/////////////////////////////////////////////////////////////
					//////Verificar si la cuota del mes esta paga o no  /////////
					/////////////////////////////////////////////////////////////
					
				try {
					plazofijo = servicePlazoFijo.listarPlazosFijosCodigo(nroPlazoFijo); //con estos datos armar la cuota
				} catch (ServiceException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
						

				System.out.println("Ingrese la cantidad de dias del deposito de plazo fijo");
				dias = cantidadDias.nextInt();
				
				
				if (dias >=90)
					{interes = 13;}
				else 
					{if (dias <=60)
					{interes = 10;}
					else
					{interes = 12;}
					}
				
				
				SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd");
				
				Calendar cal2 = Calendar.getInstance();
				Date fechaAltaRenovacion = cal2.getTime();
				
			//	System.out.println(formatter.format(fechaAlta));
				
				cal2.add(Calendar.DATE, dias);
				Date fechaVencimientoRenovacion = cal2.getTime();
				
			//	System.out.println(formatter.format(fechaVencimiento));


				montoRenovacion = (plazofijo.getMonto()*plazofijo.getInteres()/100) + plazofijo.getMonto();
				
				 System.out.println("");
				 System.out.println("dni del cliente "+ dniCliente );
				 System.out.println("fecha de alta " + formatter2.format(fechaAltaRenovacion));
				 System.out.println("fecha de vencimiento"+ (formatter2.format(fechaVencimientoRenovacion)));
				 System.out.println("nro cuenta Origen"+ plazofijo.getNrocuentaorigen() );
				 System.out.println("nro cuenta Destino"+ plazofijo.getNrocuentadestino() );
				 System.out.println("Monto del Plazo Fijo "+ montoRenovacion);
				 System.out.println("dias de Plazo "+ dias);
				 System.out.println("Interes "+ interes +"%");
				 System.out.println("Monto del interes "+ montoRenovacion * interes/100);
				 System.out.println("");
				
				///// busca la cuenta y el servicio modifica el saldo y registra el pago
			try {
				
				//bajar el plazo anterior
				servicePlazoFijo.dasactivarPlazosFijos(plazofijo.getIdplazofijo());
				//
				
				
				regPlazoFijo.cargarPlazoFijo(fechaAltaRenovacion,fechaVencimientoRenovacion,dniCliente,2,plazofijo.getNrocuentaorigen(),1,plazofijo.getNrocuentadestino(),montoRenovacion,interes);
				servicePlazoFijo.crearPlazosFijos(regPlazoFijo);
				
									
							
			} catch (ServiceException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
				
						
			
					
				break;
			    ////////////////////////////////////////////////////////////////////		
				case 3:
					
					
					
					System.out.println("Ingrese el dni del cliente que desea liquidar el plazo fijo");
					dniCliente = dni.nextInt();
					
					try {
						
						List<PlazoFijo> pf = servicePlazoFijo.listarPlazosFijosCliente(dniCliente,1);
						
						for (PlazoFijo c: pf){
							System.out.println("");
							System.out.println("Id plazo fijo: " + c.getIdplazofijo());
							System.out.println("dni: " + c.getDni());
							System.out.println("fechaalta: " + c.getFechaalta());
							System.out.println("fechavencimiento: " + c.getFechavencimiento());
							System.out.println("origen: " + c.getOrigen());
							System.out.println("cuenta origen: " + c.getNrocuentaorigen());
							System.out.println("acreditacion: " + c.getAcreditacion());
							System.out.println("cuenta destino: " + c.getNrocuentadestino());
							System.out.println("monto: " + c.getMonto());
							System.out.println("interes: " + c.getInteres()+"%");
							System.out.println("estado: " + c.getEstado());
							System.out.println("");
						}
						
						
					} catch (ServiceException e) {
						System.out.println("Error al listar los servicios pagos . " + e.getMessage());
					}
					
					
					//pide que elija un numero de cuenta
					System.out.println("Ingrese el numero de plazo fijo que desea liquidar");
					nroPlazoFijo = codPlazoFijo.nextInt();
					
					
				try {
					plazofijo = servicePlazoFijo.listarPlazosFijosCodigo(nroPlazoFijo); //con estos datos armar la cuota
				} catch (ServiceException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
				montoInteres=(plazofijo.getInteres()/100)*plazofijo.getMonto();
				montoAliquidar=plazofijo.getMonto()+montoInteres;
				
				 System.out.println("");
				 System.out.println("dni del cliente "+ plazofijo.getDni() );
				 System.out.println("fecha de alta " + plazofijo.getFechaalta());
				 System.out.println("fecha de vencimiento"+ plazofijo.getFechavencimiento());
				 System.out.println("nro cuenta Origen"+ plazofijo.getNrocuentaorigen() );
				 System.out.println("nro cuenta Destino"+ plazofijo.getNrocuentadestino() );
				 System.out.println("Monto del Plazo Fijo "+ plazofijo.getMonto());
				 System.out.println("Interes "+ plazofijo.getInteres() +"%");
				 System.out.println("Monto a liquidar "+ montoAliquidar);
				 System.out.println("pesos interes "+montoInteres);
				
				///// busca la cuenta y el servicio modifica el saldo y registra el pago
			try {
				
				//bajar el plazo anterior
				servicePlazoFijo.dasactivarPlazosFijos(plazofijo.getIdplazofijo());
				//
				//acreditar en la cuenta
									
							
			} catch (ServiceException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			
			try {
				
				cudestino = serviceCuenta.buscarCuenta(plazofijo.getNrocuentadestino()); //busco y traigo la cuenta de la cual se va a debitar el monto
									
				cudestino.setSaldo(cudestino.getSaldo()+ (plazofijo.getMonto()*plazofijo.getInteres()/100)+plazofijo.getMonto() );// modifico el saldo de esa cuenta (saldo de la cuenta - monto fijo del servicio)
				serviceCuenta.modificarSaldoCuenta(cudestino);/// le mando a modificar saldo cuenta la cuenta con el saldo modificado
													
				regMovimiento.cargarMovimiento(plazofijo.getNrocuentadestino(), 2, 5, cudestino.getSaldo(),(plazofijo.getMonto()*plazofijo.getInteres()/100)+plazofijo.getMonto());
				serviceMovimientos.registrarMovimiento(regMovimiento);
				
				
			} catch (ServiceException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
				
				
						
					
					
					
				break;
				///////////////////////////////////////////////////////////////////////////
				case 4:
					
					System.out.println("1. Listado de Plazos Fijos" );
					System.out.println("" );
					System.out.println("Ingrese el dni del cliente solicitante del plazo fijo");
					dniCliente = dni.nextInt();
					
					try {
						
						List<PlazoFijo> pf = servicePlazoFijo.listarPlazosFijosCliente(dniCliente,1);
						
						for (PlazoFijo c: pf){
							System.out.println("");
							System.out.println("Id plazo fijo: " + c.getIdplazofijo());
							System.out.println("dni: " + c.getDni());
							System.out.println("fechaalta: " + c.getFechaalta());
							System.out.println("fechavencimiento: " + c.getFechavencimiento());
							System.out.println("origen: " + c.getOrigen());
							System.out.println("cuenta origen: " + c.getNrocuentaorigen());
							System.out.println("acreditacion: " + c.getAcreditacion());
							System.out.println("cuenta destino: " + c.getNrocuentadestino());
							System.out.println("monto: " + c.getMonto());
							System.out.println("interes: " + c.getInteres()+"%");
							System.out.println("estado: " + c.getEstado());
							System.out.println("");
						}
						
						
					} catch (ServiceException e) {
						System.out.println("Error al listar los servicios pagos . " + e.getMessage());
					}
					
					
				break;
				///////////////////////////////////////////////////////////////////////////
				case 5: 
				break;
				};		  
				
		}while(operacion != 0);
		
	}

}
